#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char* argv[])
{ 
  printf("process is running...\n");
  pid_t id = fork();
  assert(id != -1);

  if(id == 0)
  {
    sleep(1);
    //./exec ls -a -l -> "./myexec" "ls" "-s" "-l"
    execvp(argv[1],&argv[1]);

    //execl("/usr/bin/ls","ls","-a","-l","--color=auto",NULL);
    //这里有两个ls，重复吗？不重复，一个是告诉系统我要执行谁？一个是告诉系统，我想怎么执行
    //execlp("ls","ls","-a","-l","--color=auto",NULL);
    
 //   char* const argv_[] = {
 //     "ls",
 //     "-a",
 //     "-l",
 //     "--color=auto",
 //     NULL
 //   };

 //   //execv("/usr/bin/ls",argv_);
 //   execvp("ls",argv_);
    
 //   execl("./mybin","mybin",NULL);
    //execl("./mycpp","mybin",NULL);
    //execl("./mypy.py","mypy.py",NULL);
    //execl("./myshell.sh","myshell.sh",NULL);

//    char* const envp_[]={
//      (char*)"MYENY=111122223333344444",
//      NULL
//    };
//    extern char** environ;
//    //execle("./mybin","mybin",NULL,envp_);
//    putenv((char*)"MYENY=444443333322211111");//将指定的环境变量导入到系统中，environ指向的环境变量表
//    execle("./mybin","mybin",NULL,environ);//实际上，默认环境变量你不传，子进程也能获取
//
    exit(1);//must failed
  }

  int status = 0;

  pid_t ret = waitpid(id, &status, 0);
  if(ret > 0) printf("wait sucess: exit code: %d,sig: %d\n",(status>>8)&0xFF,status & 0x7F);


 // //.c ->exe -> load ->process ->运行 ->执行我们现在所写的代码
 // printf("process is running...\n");

 // //load ->exe 
 // //主要是一个函数，调用就有可能失败，就是没有替换成功，就是没有替换
 // //exec*为什么没有成功返回值呢？因为成功了，就和接下来的代码无关了，判断毫无意义
 // //execl 只要返回了，一定是错误了
 // execl("/usr/bin/ls"/*要执行哪一个程序*/,"ls"/*你想怎么执行*/,"--color=auto","-a","-l",NULL);//all exec* end of NULL
 // //execl("/usr/bin/top"/*要执行哪一个程序*/,"top"/*你想怎么执行*/,NULL);//all exec* end of NULL
 // 
 // perror("execl");//打印错误原因
 // exit(1);
 // //为什么这里的printf没有在执行了???printf也是代码，是在execl之后的，
 // //execl执行完毕的时候，代码已经全部被覆盖了，开始执行新的程序的代码了，所以printf就无法执行了！
 // printf("process running done...\n");
  return 0;
}
